home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
cocktail
/
cg.lha
/
cg
/
src
/
TreeMod2.mi
< prev
next >
Wrap
Text File
|
1992-11-24
|
32KB
|
968 lines
IMPLEMENTATION MODULE TreeMod2;
IMPORT SYSTEM, System, IO, Tree;
(* line 15 "" *)
FROM IO IMPORT WriteS, WriteNl;
FROM Sets IMPORT IsElement;
FROM Idents IMPORT tIdent;
FROM Positions IMPORT tPosition;
FROM Tree IMPORT
NoTree , tTree , Options , ClassCount ,
f , WI , WN , iInteger , itTree ,
iNoTree , iModule , iMain , HasChildren ,
HasAttributes, NoCodeAttr , NoCodeClass ,
ForallClasses, ForallAttributes, Reverse ;
VAR
iClassName : tIdent;
RevChild : tTree;
PROCEDURE WriteLine (Line: tPosition);
BEGIN
IF Line.Line # 0 THEN
WriteS (f, "(* line "); WN (Line.Line); WriteS (f, ' "'); WI (Line.File); WriteS (f, '" *)'); WriteNl (f);
END;
END WriteLine;
PROCEDURE yyAbort (yyFunction: ARRAY OF CHAR);
BEGIN
IO.WriteS (IO.StdError, 'Error: module TreeMod2, routine ');
IO.WriteS (IO.StdError, yyFunction);
IO.WriteS (IO.StdError, ' failed');
IO.WriteNl (IO.StdError);
Exit;
END yyAbort;
PROCEDURE yyIsEqual (yya, yyb: ARRAY OF SYSTEM.BYTE): BOOLEAN;
VAR yyi : INTEGER;
BEGIN
FOR yyi := 0 TO INTEGER (HIGH (yya)) DO
IF yya [yyi] # yyb [yyi] THEN RETURN FALSE; END;
END;
RETURN TRUE;
END yyIsEqual;
PROCEDURE TreeIO (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Ag) THEN
(* line 43 "" *)
WITH t^.Ag DO
(* line 43 "" *)
WriteS (f, "TYPE yyPtrtTree = POINTER TO "); WI (itTree); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
WriteS (f, "VAR yyf : IO.tFile;"); WriteNl (f);
WriteS (f, "VAR yyLabel : SHORTCARD;"); WriteNl (f);
WriteS (f, "VAR yyKind : SHORTCARD;"); WriteNl (f);
WriteS (f, "VAR yyc : CHAR;"); WriteNl (f);
WriteS (f, "VAR yys : Strings.tString;"); WriteNl (f);
WriteNl (f);
IF IsElement (ORD (','), Options) THEN
WriteS (f, "PROCEDURE yyMark (yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " LOOP"); WriteNl (f);
WriteS (f, " IF yyt = "); WI (iNoTree); WriteS (f, " THEN RETURN; END;"); WriteNl (f);
WriteS (f, " INC (yyt^.yyHead.yyMark);"); WriteNl (f);
WriteS (f, " IF yyt^.yyHead.yyMark > 1 THEN RETURN; END;"); WriteNl (f);
WriteNl (f);
WriteS (f, " CASE yyt^.Kind OF"); WriteNl (f);
ForallClasses (Classes, Mark);
WriteS (f, " ELSE RETURN;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END yyMark;"); WriteNl (f);
WriteNl (f);
END;
IF IsElement (ORD (';'), Options) THEN
WriteS (f, "CONST yyInitTreeStoreSize = 32;"); WriteNl (f);
WriteNl (f);
WriteS (f, "VAR yyTreeStoreSize : LONGINT;"); WriteNl (f);
WriteS (f, "VAR yyTreeStorePtr : POINTER TO ARRAY [0..50000] OF "); WI (itTree); WriteS (f, ";"); WriteNl (f);
WriteS (f, "VAR yyLabelCount : INTEGER;"); WriteNl (f);
WriteS (f, "VAR yyRecursionLevel : SHORTINT;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyMapToLabel (yyTree: "); WI (itTree); WriteS (f, "): SHORTCARD;"); WriteNl (f);
WriteS (f, " VAR yyi : INTEGER;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " FOR yyi := 1 TO yyLabelCount DO"); WriteNl (f);
WriteS (f, " IF yyTreeStorePtr^[yyi] = yyTree THEN RETURN yyi; END;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " INC (yyLabelCount);"); WriteNl (f);
WriteS (f, " IF yyLabelCount = yyTreeStoreSize THEN"); WriteNl (f);
WriteS (f, " DynArray.ExtendArray (yyTreeStorePtr, yyTreeStoreSize, SYSTEM.TSIZE ("); WI (itTree); WriteS (f, "));"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " yyTreeStorePtr^[yyLabelCount] := yyTree;"); WriteNl (f);
WriteS (f, " RETURN yyLabelCount;"); WriteNl (f);
WriteS (f, " END yyMapToLabel;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyMapToTree (yyLabel: SHORTCARD): "); WI (itTree); WriteS (f, ";"); WriteNl (f);
WriteS (f, " BEGIN RETURN yyTreeStorePtr^[yyLabel]; END yyMapToTree;"); WriteNl (f);
WriteNl (f);
END;
IF IsElement (ORD ('w'), Options) OR
IsElement (ORD ('o'), Options) THEN
WriteS (f, "PROCEDURE yyWriteNl; BEGIN IO.WriteNl (yyf); END yyWriteNl;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyWriteSelector (yys: ARRAY OF CHAR);"); WriteNl (f);
WriteS (f, " BEGIN IO.WriteS (yyf, yys); Layout.WriteSpaces (yyf, 15 - INTEGER (HIGH (yys))); IO.WriteS (yyf, ' = '); END yyWriteSelector;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyWriteHex (VAR yyx: ARRAY OF SYSTEM.BYTE);"); WriteNl (f);
WriteS (f, " VAR yyi : INTEGER;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " FOR yyi := 0 TO INTEGER (HIGH (yyx)) DO"); WriteNl (f);
WriteS (f, " IO.WriteN (yyf, ORD (CHAR (yyx [yyi])), 2, 16);"); WriteNl (f);
WriteS (f, " IO.WriteC (yyf, ' ');"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END yyWriteHex;"); WriteNl (f);
WriteNl (f);
END;
IF IsElement (ORD ('o'), Options) THEN
WriteS (f, "PROCEDURE yyWriteAdr (yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " IF yyt = "); WI (iNoTree); WriteS (f, " THEN"); WriteNl (f);
WriteS (f, " IO.WriteS (yyf, '"); WI (iNoTree); WriteS (f, "');"); WriteNl (f);
WriteS (f, " ELSE"); WriteNl (f);
WriteS (f, " yyWriteHex (yyt);"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " yyWriteNl;"); WriteNl (f);
WriteS (f, " END yyWriteAdr;"); WriteNl (f);
WriteNl (f);
ForallClasses (Classes, WriteNode);
WriteS (f, "PROCEDURE Write"); WI (iModule); WriteS (f, "Node (yyyf: IO.tFile; yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " yyf := yyyf;"); WriteNl (f);
WriteS (f, " IF yyt = "); WI (iNoTree); WriteS (f, " THEN"); WriteNl (f);
WriteS (f, " IO.WriteS (yyf, '"); WI (iNoTree); WriteS (f, "'); yyWriteNl; RETURN;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteNl (f);
WriteS (f, " CASE yyt^.Kind OF"); WriteNl (f);
ForallClasses (Classes, WriteNodeName);
WriteS (f, " ELSE"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END Write"); WI (iModule); WriteS (f, "Node;"); WriteNl (f);
WriteNl (f);
END;
IF IsElement (ORD ('w'), Options) THEN
WriteS (f, "VAR yyIndentLevel : SHORTINT;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE Write"); WI (iModule); WriteS (f, " (yyyf: IO.tFile; yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteS (f, " VAR yySaveLevel : SHORTINT;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " yyf := yyyf;"); WriteNl (f);
WriteS (f, " IF yyRecursionLevel = 0 THEN yyLabelCount := 0; END;"); WriteNl (f);
WriteS (f, " INC (yyRecursionLevel);"); WriteNl (f);
WriteS (f, " yyMark (yyt);"); WriteNl (f);
WriteS (f, " yySaveLevel := yyIndentLevel;"); WriteNl (f);
WriteS (f, " yyIndentLevel := 0;"); WriteNl (f);
WriteS (f, " yyWrite"); WI (iModule); WriteS (f, " (yyt);"); WriteNl (f);
WriteS (f, " yyIndentLevel := yySaveLevel;"); WriteNl (f);
WriteS (f, " DEC (yyRecursionLevel);"); WriteNl (f);
WriteS (f, " END Write"); WI (iModule); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyIndentSelector (yys: ARRAY OF CHAR);"); WriteNl (f);
WriteS (f, " BEGIN Layout.WriteSpaces (yyf, yyIndentLevel); yyWriteSelector (yys); END yyIndentSelector;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyIndentSelectorTree (yys: ARRAY OF CHAR; yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteS (f, " BEGIN yyIndentSelector (yys); write"); WI (itTree); WriteS (f, " (yyt) END yyIndentSelectorTree;"); WriteNl (f);
WriteNl (f);
ForallClasses (Classes, WriteAttributes);
WriteS (f, "PROCEDURE yyWrite"); WI (iModule); WriteS (f, " (yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteS (f, " VAR yyLevel : SHORTCARD;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " yyLevel := yyIndentLevel;"); WriteNl (f);
WriteS (f, " LOOP"); WriteNl (f);
WriteS (f, " IF yyt = "); WI (iNoTree); WriteS (f, " THEN"); WriteNl (f);
WriteS (f, " IO.WriteS (yyf, ' "); WI (iNoTree); WriteS (f, "'); yyWriteNl; EXIT;"); WriteNl (f);
WriteS (f, " ELSIF yyt^.yyHead.yyMark = 0 THEN"); WriteNl (f);
WriteS (f, " IO.WriteC (yyf, '^'); IO.WriteI (yyf, yyMapToLabel (yyt), 0); yyWriteNl; EXIT;"); WriteNl (f);
WriteS (f, " ELSIF yyt^.yyHead.yyMark > 1 THEN"); WriteNl (f);
WriteS (f, " yyWriteNl; IO.WriteN (yyf, yyMapToLabel (yyt), 6, 10); IO.WriteC (yyf, ':');"); WriteNl (f);
WriteS (f, " Layout.WriteSpaces (yyf, yyIndentLevel - 7);"); WriteNl (f);
WriteS (f, " ELSE"); WriteNl (f);
WriteS (f, " IO.WriteC (yyf, ' ');"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " yyt^.yyHead.yyMark := 0;"); WriteNl (f);
WriteS (f, " INC (yyIndentLevel, 2);"); WriteNl (f);
WriteNl (f);
WriteS (f, " CASE yyt^.Kind OF"); WriteNl (f);
ForallClasses (Classes, WriteClassName);
WriteS (f, " ELSE EXIT;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " yyIndentLevel := yyLevel;"); WriteNl (f);
WriteS (f, " END yyWrite"); WI (iModule); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
END;
IF IsElement (ORD ('r'), Options) THEN
WriteS (f, "PROCEDURE Read"); WI (iModule); WriteS (f, " (yyyf: IO.tFile): "); WI (itTree); WriteS (f, ";"); WriteNl (f);
WriteS (f, " VAR yyt : "); WI (itTree); WriteS (f, ";"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " yyf := yyyf;"); WriteNl (f);
WriteS (f, " IF yyRecursionLevel = 0 THEN yyLabelCount := 0; END;"); WriteNl (f);
WriteS (f, " INC (yyRecursionLevel);"); WriteNl (f);
WriteS (f, " IF NOT yyIsInitialized THEN"); WriteNl (f);
WriteS (f, " yyInitKindToIdent; yyIsInitialized := TRUE;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " yyRead"); WI (iModule); WriteS (f, " (SYSTEM.ADR (yyt));"); WriteNl (f);
WriteS (f, " DEC (yyRecursionLevel);"); WriteNl (f);
WriteS (f, " RETURN yyt;"); WriteNl (f);
WriteS (f, " END Read"); WI (iModule); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyRead"); WI (iModule); WriteS (f, " (yyt: yyPtrtTree);"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " LOOP"); WriteNl (f);
WriteS (f, " CASE IO.ReadC (yyf) OF"); WriteNl (f);
WriteS (f, " | '^': yyLabel := IO.ReadI (yyf); yyReadNl; yyt^ := yyMapToTree (yyLabel); RETURN;"); WriteNl (f);
WriteS (f, " | 12C, '0': yyLabel := IO.ReadI (yyf); yyc := IO.ReadC (yyf);"); WriteNl (f);
WriteS (f, " Layout.SkipSpaces (yyf); Strings.ReadL (yyf, yys);"); WriteNl (f);
WriteS (f, " yyKind := yyMapToKind (yys); yyt^ := Make"); WI (iMain); WriteS (f, " (yyKind);"); WriteNl (f);
WriteS (f, " IF yyLabel # yyMapToLabel (yyt^) THEN IO.WriteS (IO.StdError, '"); WI (iModule); WriteS (f, ": error in Read");
WI (iModule); WriteS (f, "'); IO.WriteNl (IO.StdError); yyExit; END;"); WriteNl (f);
WriteS (f, " ELSE"); WriteNl (f);
WriteS (f, " Layout.SkipSpaces (yyf); Strings.ReadL (yyf, yys);"); WriteNl (f);
WriteS (f, " yyKind := yyMapToKind (yys);"); WriteNl (f);
WriteS (f, " IF yyKind = 0 THEN yyt^ := "); WI (iNoTree); WriteS (f, "; RETURN; END;"); WriteNl (f);
WriteS (f, " yyt^ := Make"); WI (iMain); WriteS (f, " (yyKind);"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteNl (f);
WriteS (f, " CASE yyKind OF"); WriteNl (f);
ForallClasses (Classes, ReadAttributes);
WriteS (f, " ELSE RETURN;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END yyRead"); WI (iModule); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
WriteS (f, "VAR yyKindToIdent : ARRAY [0.."); WN (ClassCount); WriteS (f, "] OF Idents.tIdent;"); WriteNl (f);
WriteS (f, "VAR yyIsInitialized : BOOLEAN;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyMapToKind (VAR yys: Strings.tString): SHORTCARD;"); WriteNl (f);
WriteS (f, " VAR yyi : Idents.tIdent;"); WriteNl (f);
WriteS (f, " VAR yyk : SHORTCARD;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " yyi := Idents.MakeIdent (yys);"); WriteNl (f);
WriteS (f, " FOR yyk := 0 TO "); WN (ClassCount); WriteS (f, " DO"); WriteNl (f);
WriteS (f, " IF yyKindToIdent [yyk] = yyi THEN RETURN yyk; END;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " RETURN 0;"); WriteNl (f);
WriteS (f, " END yyMapToKind;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyInitKindToIdent2 (yya: ARRAY OF CHAR; yyKind: SHORTCARD);"); WriteNl (f);
WriteS (f, " VAR yys : Strings.tString;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " Strings.ArrayToString (yya, yys);"); WriteNl (f);
WriteS (f, " yyKindToIdent [yyKind] := Idents.MakeIdent (yys);"); WriteNl (f);
WriteS (f, " END yyInitKindToIdent2;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyInitKindToIdent;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " yyInitKindToIdent2 ('"); WI (iNoTree); WriteS (f, "', 0);"); WriteNl (f);
ForallClasses (Classes, InitKindToIdent);
WriteS (f, " END yyInitKindToIdent;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyReadNl; BEGIN IO.ReadNl (yyf); END yyReadNl;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyReadIdent (): Idents.tIdent;"); WriteNl (f);
WriteS (f, " VAR yys : Strings.tString;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " Strings.ReadL (yyf, yys);"); WriteNl (f);
WriteS (f, " IO.UnRead (yyf);"); WriteNl (f);
WriteS (f, " RETURN Idents.MakeIdent (yys);"); WriteNl (f);
WriteS (f, " END yyReadIdent;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyReadHex (VAR yyx: ARRAY OF SYSTEM.BYTE);"); WriteNl (f);
WriteS (f, " VAR yyi : INTEGER;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " FOR yyi := 0 TO INTEGER (HIGH (yyx)) DO"); WriteNl (f);
WriteS (f, " yyx [yyi] := SYSTEM.BYTE (CHR (CARDINAL (IO.ReadN (yyf, 16))));"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END yyReadHex;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yySkip;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " REPEAT UNTIL IO.ReadC (yyf) = '='; yyc := IO.ReadC (yyf);"); WriteNl (f);
WriteS (f, " END yySkip;"); WriteNl (f);
WriteNl (f);
END;
WriteS (f, "CONST yyNil = 374C;"); WriteNl (f);
WriteS (f, "CONST yyNoLabel = 375C;"); WriteNl (f);
WriteS (f, "CONST yyLabelDef = 376C;"); WriteNl (f);
WriteS (f, "CONST yyLabelUse = 377C;"); WriteNl (f);
WriteNl (f);
IF IsElement (ORD ('p'), Options) THEN
WriteS (f, "PROCEDURE Put"); WI (iModule); WriteS (f, " (yyyf: IO.tFile; yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " yyf := yyyf;"); WriteNl (f);
WriteS (f, " IF yyRecursionLevel = 0 THEN yyLabelCount := 0; END;"); WriteNl (f);
WriteS (f, " INC (yyRecursionLevel);"); WriteNl (f);
WriteS (f, " yyMark (yyt);"); WriteNl (f);
WriteS (f, " yyPut"); WI (iModule); WriteS (f, " (yyt);"); WriteNl (f);
WriteS (f, " DEC (yyRecursionLevel);"); WriteNl (f);
WriteS (f, " END Put"); WI (iModule); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyPut"); WI (iModule); WriteS (f, " (yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " LOOP"); WriteNl (f);
WriteS (f, " IF yyt = "); WI (iNoTree); WriteS (f, " THEN"); WriteNl (f);
WriteS (f, " IO.WriteC (yyf, yyNil); RETURN;"); WriteNl (f);
WriteS (f, " ELSIF yyt^.yyHead.yyMark = 0 THEN"); WriteNl (f);
WriteS (f, " IO.WriteC (yyf, yyLabelUse); yyLabel := yyMapToLabel (yyt); yyPut (yyLabel);"); WriteNl (f);
WriteS (f, " RETURN;"); WriteNl (f);
WriteS (f, " ELSIF yyt^.yyHead.yyMark > 1 THEN"); WriteNl (f);
WriteS (f, " IO.WriteC (yyf, yyLabelDef); yyLabel := yyMapToLabel (yyt); yyPut (yyLabel);"); WriteNl (f);
IF ClassCount > 251 THEN
WriteS (f, " yyPut (yyt^.Kind);"); WriteNl (f);
WriteS (f, " ELSIF yyt^.Kind > 251 THEN"); WriteNl (f);
WriteS (f, " IO.WriteC (yyf, yyNoLabel); yyPut (yyt^.Kind);"); WriteNl (f);
ELSE
WriteS (f, " IO.WriteC (yyf, CHR (yyt^.Kind));"); WriteNl (f);
END;
WriteS (f, " ELSE"); WriteNl (f);
WriteS (f, " IO.WriteC (yyf, CHR (yyt^.Kind));"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " yyt^.yyHead.yyMark := 0;"); WriteNl (f);
WriteNl (f);
WriteS (f, " CASE yyt^.Kind OF"); WriteNl (f);
ForallClasses (Classes, PutAttributes);
WriteS (f, " ELSE RETURN;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END yyPut"); WI (iModule); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyPut (VAR yyx: ARRAY OF SYSTEM.BYTE);"); WriteNl (f);
WriteS (f, " VAR yyi : INTEGER;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " yyi := IO.Write (yyf, SYSTEM.ADR (yyx), INTEGER (HIGH (yyx)) + 1);"); WriteNl (f);
WriteS (f, " END yyPut;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyPutIdent (yyi: Idents.tIdent);"); WriteNl (f);
WriteS (f, " VAR yys : Strings.tString;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " Idents.GetString (yyi, yys);"); WriteNl (f);
WriteS (f, " Strings.WriteL (yyf, yys);"); WriteNl (f);
WriteS (f, " END yyPutIdent;"); WriteNl (f);
WriteNl (f);
END;
IF IsElement (ORD ('g'), Options) THEN
WriteS (f, "PROCEDURE Get"); WI (iModule); WriteS (f, " (yyyf: IO.tFile): "); WI (itTree); WriteS (f, ";"); WriteNl (f);
WriteS (f, " VAR yyt : "); WI (itTree); WriteS (f, ";"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " yyf := yyyf;"); WriteNl (f);
WriteS (f, " IF yyRecursionLevel = 0 THEN yyLabelCount := 0; END;"); WriteNl (f);
WriteS (f, " INC (yyRecursionLevel);"); WriteNl (f);
WriteS (f, " yyGet"); WI (iModule); WriteS (f, " (SYSTEM.ADR (yyt));"); WriteNl (f);
WriteS (f, " DEC (yyRecursionLevel);"); WriteNl (f);
WriteS (f, " RETURN yyt;"); WriteNl (f);
WriteS (f, " END Get"); WI (iModule); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyGet"); WI (iModule); WriteS (f, " (yyt: yyPtrtTree);"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " LOOP"); WriteNl (f);
WriteS (f, " yyc := IO.ReadC (yyf);"); WriteNl (f);
WriteS (f, " CASE yyc OF"); WriteNl (f);
WriteS (f, " | yyNil : yyt^ := "); WI (iNoTree); WriteS (f, "; RETURN;"); WriteNl (f);
WriteS (f, " | yyLabelUse : yyGet (yyLabel); yyt^ := yyMapToTree (yyLabel); RETURN;"); WriteNl (f);
WriteS (f, " | yyLabelDef : yyGet (yyLabel);");
IF ClassCount > 251 THEN
WriteS (f, " yyGet (yyKind);");
ELSE
WriteS (f, " yyKind := ORD (IO.ReadC (yyf));");
END;
WriteS (f, " yyt^ := Make"); WI (iMain); WriteS (f, " (yyKind);"); WriteNl (f);
WriteS (f, " IF yyLabel # yyMapToLabel (yyt^) THEN IO.WriteS (IO.StdError, '"); WI (iModule); WriteS (f, ": error in Get");
WI (iModule); WriteS (f, "'); IO.WriteNl (IO.StdError); yyExit; END;"); WriteNl (f);
IF ClassCount > 251 THEN
WriteS (f, " | yyNoLabel : yyGet (yyKind); yyt^ := Make"); WI (iMain); WriteS (f, " (yyKind);"); WriteNl (f);
END;
WriteS (f, " ELSE yyKind := ORD (yyc); yyt^ := Make"); WI (iMain); WriteS (f, " (yyKind);"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteNl (f);
WriteS (f, " CASE yyKind OF"); WriteNl (f);
ForallClasses (Classes, GetAttributes);
WriteS (f, " ELSE RETURN;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END yyGet"); WI (iModule); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyGet (VAR yyx: ARRAY OF SYSTEM.BYTE);"); WriteNl (f);
WriteS (f, " VAR yyi : INTEGER;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " yyi := IO.Read (yyf, SYSTEM.ADR (yyx), INTEGER (HIGH (yyx)) + 1);"); WriteNl (f);
WriteS (f, " END yyGet;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyGetIdent (VAR yyi: Idents.tIdent);"); WriteNl (f);
WriteS (f, " VAR yys : Strings.tString;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " Strings.ReadL (yyf, yys);"); WriteNl (f);
WriteS (f, " yyi := Idents.MakeIdent (yys);"); WriteNl (f);
WriteS (f, " END yyGetIdent;"); WriteNl (f);
WriteNl (f);
END;
;
RETURN;
END;
END;
END TreeIO;
PROCEDURE WriteNodeName (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 397 "" *)
WITH t^.Class DO
(* line 397 "" *)
IF (NoCodeClass * Properties) = {} THEN
WriteS (f, "| "); WI (Name); WriteS (f, ": IO.WriteS (yyf, '"); WI (Name); WriteS (f, "'); yyWriteNl;");
IF ({HasChildren, HasAttributes} * Properties) # {} THEN
WriteS (f, " yWriteNode"); WI (Name); WriteS (f, " (yyt);");
END;
WriteNl (f);
END;
;
RETURN;
END;
END;
END WriteNodeName;
PROCEDURE WriteNode (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 410 "" *)
WITH t^.Class DO
(* line 410 "" *)
IF ((NoCodeClass * Properties) = {}) AND
(({HasChildren, HasAttributes} * Properties) # {}) THEN
WriteS (f, "PROCEDURE yWriteNode"); WI (Name); WriteS (f, " (yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
IF (BaseClass^.Kind = Tree.Class) AND (* NOT Top ? *)
(({HasChildren, HasAttributes} * BaseClass^.Class.Properties) # {}) THEN
WriteS (f, " yWriteNode"); WI (BaseClass^.Class.Name); WriteS (f, " (yyt); "); WriteNl (f);
END;
iClassName := Name;
ForallAttributes (Attributes, WriteNode);
WriteS (f, " END yWriteNode"); WI (Name); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
END;
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Child) THEN
(* line 425 "" *)
WITH t^.Child DO
(* line 425 "" *)
WriteS (f, " yyWriteSelector ('"); WI (Name); WriteS (f, "');");
WriteS (f, " yyWriteAdr (yyt^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ");"); WriteNl (f);
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 429 "" *)
WITH t^.Attribute DO
(* line 429 "" *)
IF (NoCodeAttr * Properties) = {} THEN
WriteS (f, " yyWriteSelector ('"); WI (Name); WriteS (f, "'); write"); WI (Type);
WriteS (f, " (yyt^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ") yyWriteNl;"); WriteNl (f);
END;
;
RETURN;
END;
END;
END WriteNode;
PROCEDURE Mark (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 439 "" *)
WITH t^.Class DO
(* line 439 "" *)
IF ((NoCodeClass * Properties) = {}) AND (HasChildren IN Properties) THEN
WriteS (f, "| "); WI (Name); WriteS (f, ":"); WriteNl (f);
GetIterator (t);
iClassName := Name;
ForallAttributes (t, Mark);
IF Iterator = NoTree THEN
WriteS (f, "RETURN;"); WriteNl (f);
ELSE
WriteS (f, "yyt := yyt^."); WI (iClassName); WriteS (f, "."); WI (Iterator^.Child.Name); WriteS (f, ";"); WriteNl (f);
END;
END;
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Child) THEN
(* line 452 "" *)
WITH t^.Child DO
(* line 452 "" *)
IF t # Iterator THEN
WriteS (f, "yyMark (yyt^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ");"); WriteNl (f);
END;
;
RETURN;
END;
END;
END Mark;
PROCEDURE WriteClassName (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 461 "" *)
WITH t^.Class DO
(* line 461 "" *)
IF (NoCodeClass * Properties) = {} THEN
WriteS (f, "| "); WI (Name); WriteS (f, ": ");
IF ({HasChildren, HasAttributes} * Properties) # {} THEN
WriteS (f, "yWrite"); WI (Name); WriteS (f, " (yyt); ");
GetIterator (t);
IF Iterator = NoTree THEN
WriteS (f, "EXIT;"); WriteNl (f);
ELSE
WriteS (f, "yyIndentSelector ('"); WI (Iterator^.Child.Name); WriteS (f, "'); ");
WriteS (f, "yyt := yyt^."); WI (Name); WriteS (f, "."); WI (Iterator^.Child.Name); WriteS (f, ";"); WriteNl (f);
END;
ELSE
WriteS (f, "IO.WriteS (yyf, '"); WI (Name); WriteS (f, "'); yyWriteNl; EXIT;"); WriteNl (f);
END;
END;
;
RETURN;
END;
END;
END WriteClassName;
PROCEDURE WriteAttributes (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 482 "" *)
WITH t^.Class DO
(* line 482 "" *)
IF ((NoCodeClass * Properties) = {}) AND
(({HasChildren, HasAttributes} * Properties) # {}) THEN
WriteS (f, "PROCEDURE yWrite"); WI (Name); WriteS (f, " (yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " IO.WriteS (yyf, '"); WI (Name); WriteS (f, "'); yyWriteNl;"); WriteNl (f);
GetIterator (t);
iClassName := Name;
ForallAttributes (t, WriteAttributes);
WriteS (f, " END yWrite"); WI (Name); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
END;
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Child) THEN
(* line 495 "" *)
WITH t^.Child DO
(* line 495 "" *)
IF t # Iterator THEN
WriteS (f, " yyIndentSelectorTree ('"); WI (Name); WriteS (f, "', yyt^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ");"); WriteNl (f);
END;
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 500 "" *)
WITH t^.Attribute DO
(* line 500 "" *)
IF (NoCodeAttr * Properties) = {} THEN
WriteS (f, " yyIndentSelector ('"); WI (Name); WriteS (f, "'); ");
WriteS (f, "write"); WI (Type); WriteS (f, " (yyt^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ") yyWriteNl;"); WriteNl (f);
END;
;
RETURN;
END;
END;
END WriteAttributes;
PROCEDURE ReadAttributes (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 510 "" *)
WITH t^.Class DO
(* line 510 "" *)
IF ((NoCodeClass * Properties) = {}) AND
(({HasChildren, HasAttributes} * Properties) # {}) THEN
WriteS (f, "| "); WI (Name); WriteS (f, ":"); WriteNl (f);
GetIterator (t);
iClassName := Name;
ForallAttributes (t, ReadAttributes);
IF Iterator = NoTree THEN
WriteS (f, "RETURN;"); WriteNl (f);
ELSE
WriteS (f, "yySkip; yyt := SYSTEM.ADR (yyt^^."); WI (iClassName); WriteS (f, "."); WI (Iterator^.Child.Name); WriteS (f, ");"); WriteNl (f);
END;
END;
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Child) THEN
(* line 524 "" *)
WITH t^.Child DO
(* line 524 "" *)
IF t # Iterator THEN
WriteS (f, "yySkip; read"); WI (itTree); WriteS (f, " (SYSTEM.ADR (yyt^^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, "))"); WriteNl (f);
END;
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 529 "" *)
WITH t^.Attribute DO
(* line 529 "" *)
IF (NoCodeAttr * Properties) = {} THEN
WriteS (f, "yySkip; read"); WI (Type); WriteS (f, " (yyt^^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ") yyReadNl;"); WriteNl (f);
END;
;
RETURN;
END;
END;
END ReadAttributes;
PROCEDURE PutAttributes (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 538 "" *)
WITH t^.Class DO
(* line 538 "" *)
IF ((NoCodeClass * Properties) = {}) AND
(({HasChildren, HasAttributes} * Properties) # {}) THEN
WriteS (f, "| "); WI (Name); WriteS (f, ":"); WriteNl (f);
GetIterator (t);
iClassName := Name;
ForallAttributes (t, PutAttributes);
IF Iterator = NoTree THEN
WriteS (f, "RETURN;"); WriteNl (f);
ELSE
WriteS (f, "yyt := yyt^."); WI (iClassName); WriteS (f, "."); WI (Iterator^.Child.Name); WriteS (f, ";"); WriteNl (f);
END;
END;
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Child) THEN
(* line 552 "" *)
WITH t^.Child DO
(* line 552 "" *)
IF t # Iterator THEN
WriteS (f, "put"); WI (itTree); WriteS (f, " (yyt^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ")"); WriteNl (f);
END;
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 557 "" *)
WITH t^.Attribute DO
(* line 557 "" *)
IF (NoCodeAttr * Properties) = {} THEN
WriteS (f, "put"); WI (Type); WriteS (f, " (yyt^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ")"); WriteNl (f);
END;
;
RETURN;
END;
END;
END PutAttributes;
PROCEDURE GetAttributes (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 566 "" *)
WITH t^.Class DO
(* line 566 "" *)
IF ((NoCodeClass * Properties) = {}) AND
(({HasChildren, HasAttributes} * Properties) # {}) THEN
WriteS (f, "| "); WI (Name); WriteS (f, ":"); WriteNl (f);
GetIterator (t);
iClassName := Name;
ForallAttributes (t, GetAttributes);
IF Iterator = NoTree THEN
WriteS (f, "RETURN;"); WriteNl (f);
ELSE
WriteS (f, "yyt := SYSTEM.ADR (yyt^^."); WI (iClassName); WriteS (f, "."); WI (Iterator^.Child.Name); WriteS (f, ");"); WriteNl (f);
END;
END;
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Child) THEN
(* line 580 "" *)
WITH t^.Child DO
(* line 580 "" *)
IF t # Iterator THEN
WriteS (f, "get"); WI (itTree); WriteS (f, " (SYSTEM.ADR (yyt^^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, "))"); WriteNl (f);
END;
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 585 "" *)
WITH t^.Attribute DO
(* line 585 "" *)
IF (NoCodeAttr * Properties) = {} THEN
WriteS (f, "get"); WI (Type); WriteS (f, " (yyt^^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ")"); WriteNl (f);
END;
;
RETURN;
END;
END;
END GetAttributes;
PROCEDURE InitKindToIdent (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 594 "" *)
WITH t^.Class DO
(* line 594 "" *)
IF (NoCodeClass * Properties) = {} THEN
WriteS (f, " yyInitKindToIdent2 ('"); WI (Name); WriteS (f, "', "); WI (Name); WriteS (f, ");"); WriteNl (f);
END;
;
RETURN;
END;
END;
END InitKindToIdent;
PROCEDURE GetIterator (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 603 "" *)
WITH t^.Class DO
(* line 603 "" *)
Iterator := NoTree;
RevChild := NoTree;
ForallAttributes (t, GetIterator);
IF RevChild # NoTree THEN Iterator := RevChild; END;
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Child) THEN
(* line 609 "" *)
WITH t^.Child DO
(* line 609 "" *)
Iterator := t;
IF Reverse IN Properties THEN RevChild := t; END;
;
RETURN;
END;
END;
END GetIterator;
PROCEDURE BeginTreeMod2;
BEGIN
END BeginTreeMod2;
PROCEDURE CloseTreeMod2;
BEGIN
END CloseTreeMod2;
PROCEDURE yyExit;
BEGIN
IO.CloseIO; System.Exit (1);
END yyExit;
BEGIN
yyf := IO.StdOutput;
Exit := yyExit;
BeginTreeMod2;
END TreeMod2.